from django.http import HttpResponse
from django.core.serializers import serialize
from django.core.cache import cache
from django.utils import timezone

from ...models.chat_model import ChatModel
from ...models.users import Users
from ...utils.users import get_login_user_id
from ...utils.time_conversion import iso_to_times

import json
import ast


def model_list(request):
    '''
    获取模型
    '''
    # 如果用户没有登录，则加载所有开放模型
    # print(request.session.keys(), "尼玛")
    userid = get_login_user_id(request, isadmin=False)

    # 这个里面存放了 用户要是绑定了用户组的 模型
    merged_list = []

    if not userid:
        # 加载所有开放的模型
        all_chatmodel = ChatModel.objects.filter(enabled=True)
    else:
        # # 先从redis缓存中获取用户信息
        # user_mes_json = cache.get(f'user_info_{userid}')

        # if user_mes_json:
        #     user_models_json = user_mes_json['chat_models']
        # else:

        # 直接获取用户信息 不去redis里获取
        re_user_obj = Users.objects.get(id=userid)
        # [1, 18, 20, 17]
        user_models_str = re_user_obj.chat_models_json

        user_models_json = ast.literal_eval(user_models_str)

        # 获取这个用户所有的模型 并且是启动的模型
        all_chatmodel_user = ChatModel.objects.filter(id__in=user_models_json, enabled=True)
        ids1 = list(all_chatmodel_user.values_list('id', flat=True))

        # 获取所有开放的模型
        all_chatmodel_open = ChatModel.objects.filter(enabled=True, open=True)
        ids2 = list(all_chatmodel_open.values_list('id', flat=True))

        # 使用集合去重和合并 这个是用户自己的绑定的模型 还有开放的模型 id 列表
        unique_ids = list(set(ids1 + ids2))


        ################################################################################
        # 判断用户是否绑定了用户组
        # 获取用户组里面的模型 并且添加这个模型是免费的标识
        # <QuerySet [<UsersGroup: UsersGroup object (4)>]>
        all_usergroup_obj = re_user_obj.userList.all()
        # merged_list = []
        if all_usergroup_obj:
            # 如果用户绑定了用户组 获取用户组里面的 免费使用的模型 可能用户绑定了多个用户组
            usergroup_models_list = []
            for usergroup_obj in all_usergroup_obj:
                # [1, 18, 20, 17] u_obj.expired_time.replace() >= timezone.now()
                # 只有用户组没过期的 对应的模型 才加入免费模型列表
                if usergroup_obj.user_expired_time.replace() >= timezone.now():
                    usergroup_obj_models_json = ast.literal_eval(usergroup_obj.chat_models_json)
                    usergroup_models_list += usergroup_obj_models_json

            # 去重列表
            merged_list = list(set(usergroup_models_list))

        ################################################################################


        ################################################################################
        # 这里是要是用户绑定了用户组，那么就判断用户的哪些模型是免费的
        # 把用户模型和用户组模型列表 去重合并。然后整体去判断哪些模型是免费的
        all_chatmodel_listids = list(set(unique_ids + merged_list))
        ################################################################################


        # 最终的模型数据
        all_chatmodel = ChatModel.objects.filter(id__in=all_chatmodel_listids)


    json_data_str = serialize('json', all_chatmodel)
    json_data = json.loads(json_data_str)

    data = []
    for i in range(len(json_data)):
        models_id = json_data[i]['pk']
        json_data[i]['fields']['id'] = models_id

        # 数据处理
        created_at_second = iso_to_times(json_data[i]['fields']['created_at'])
        updated_at_second = iso_to_times(json_data[i]['fields']['updated_at'])
        json_data[i]['fields']['created_at'] = created_at_second
        json_data[i]['fields']['updated_at'] = updated_at_second

        # 连表查询key name
        if json_data[i]['fields']['key_id'] is None:
            json_data[i]['fields']['key_id'] = 0
            json_data[i]['fields']['key_name'] = ""
        else:
            json_data[i]['fields']['key_name'] = all_chatmodel[i].key_id.name

        # 判断这个模型是否在用户绑定的用户组里 在的话就是免费的 就添加一个字段
        if models_id in merged_list:
            json_data[i]['fields']['free'] = True
        else:
            json_data[i]['fields']['free'] = False


        data.append(json_data[i]['fields'])

    # 返回数据
    res_mes = {
        "code": 0,
        "data": data
    }
    res_mes_json = json.dumps(res_mes, ensure_ascii=False)
    return HttpResponse(res_mes_json)

